package tpcomp2010.estructura;

/**
 *
 * Clase que representa la clave de una entrada en la matriz de transicion
 */
public class MatrizTransicionKey {
    /**
     * Lista a la cual representa
     * @see ListaNodos
     */
    private ListaNodos indiceNodos;

    /**
     * token al que representa
     * @see Token
     */
    private Token indiceToken;

    /**
     * Class Constructor especificando la lista de nodos y al token que representa
     * @param list
     * @param tok
     */
    public MatrizTransicionKey(ListaNodos list, Token tok) {
        this.indiceNodos = list;
        this.indiceToken = tok;
    }

    /**
     * Retorna la ListaNodo al que representa este KEY
     * @return ListaNodo al que representa este KEY
     */
    public ListaNodos getIndiceNodos() {
        return this.indiceNodos;
    }

    /**
     * Establece la ListaNodo a la cual representa este Key
     * @param indiceNodos
     */
    public void setIndiceNodos(ListaNodos indiceNodos) {
        this.indiceNodos = indiceNodos;
    }

    /**
     * Devuelve el Token
     * @return indiceToken
     */
    public Token getIndiceToken() {
        return this.indiceToken;
    }

    /**
     * Establece el token que esta clave representa
     * @param indiceToken
     */
    public void setIndiceToken(Token indiceToken) {
        this.indiceToken = indiceToken;
    }

    /**
     * Compara con otro MatrizTransicionKey
     * @param otro objeto a comparar
     * @return 0 si son iguales, -1 caso contrario
     */
    public int compareTo(Object otro){
        MatrizTransicionKey o = (MatrizTransicionKey) otro;
        if(indiceToken.getValor().compareTo(o.getIndiceToken().getValor()) == 0) {
            if(indiceNodos.compareTo(o.getIndiceNodos()) == 0){
                return 0;
            }else{
                return -1;
            }
        }else{
            return -1;
        }
    }

    /**
     * Compara con otro MatrizTransicionKey
     * @param otro
     * @return true si son iguales, false en caso contrario
     */
    @Override
    public boolean equals(Object otro){
        MatrizTransicionKey o = (MatrizTransicionKey) otro;
        if(indiceToken.getValor().compareTo(o.getIndiceToken().getValor()) == 0) {
            if(indiceNodos.compareTo(o.getIndiceNodos()) == 0){
                return true;
            }else{
                return false;
            }
        }else{
            return false;
        }
    }

    /**
     * VAlor hash del objeto
     * @return el calculo del hash
     */
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 83 * hash + (this.indiceNodos != null ? this.indiceNodos.hashCode() : 0);
        hash = 83 * hash + (this.indiceToken != null ? this.indiceToken.hashCode() : 0);
        return hash;
    }

}
